package baseUserModel

import (
	"github.com/mitchellh/mapstructure"
	"learn/app/models/cm"
	"learn/pkg/hepler"
	"learn/pkg/logger"
)

// LearnRole 角色表
type Menu struct {
	cm.BaseModel `mapstructure:",squash"`
	Pid          int64  `json:"pid" gorm:"pid"`                                      // 父级 id
	MenuName     string `json:"menu_name" gorm:"menu_name" mapstructure:"menu_name"` // 菜单
	MenuPath     string `json:"menu_path" gorm:"menu_path" mapstructure:"menu_path"` // 菜单路径
	Status       int8   `json:"status" gorm:"status"`                                // 菜单状态：1 正常，2 关闭
	Order        int8   `json:"order" gorm:"order"`                                  // 排序
	cm.CommonTimestampsField
}

// TableName 表名称
func (*Menu) TableName() string {
	return "learn_menu"
}

func (obj *Menu) Add(input map[string]interface{}) uint64 {
	menu := Menu{}
	if err := mapstructure.Decode(input, &menu); err != nil {
		logger.Error("db Err" + err.Error())
		return 0
	}
	res := obj.Db().Create(&menu)
	if res.Error != nil {
		logger.Error("db Err" + res.Error.Error())
		return 0
	}
	return menu.ID
}

func (obj *Menu) List() ([]map[string]interface{}, int64) {
	muneList := []Menu{} // 不用结构体。无法使用自定义类型
	var count int64

	res := obj.Db().Model(Menu{}).Find(&muneList).Count(&count)

	if res.Error != nil {
		logger.Error("db Err" + res.Error.Error())
	}
	return obj.StructSliceToMapSlice(muneList), count
}

func (obj *Menu) Update(input map[string]interface{}) uint64 {
	menu := Menu{}
	if err := mapstructure.Decode(input, &menu); err != nil {
		logger.Error("db Err" + err.Error())
		return 0
	}
	db := obj.Db()
	if hepler.Empty(menu.ID) == false {
		db = db.Where("id", menu.ID)
	} else {
		return 0
	}

	res := db.Updates(&menu)
	if res.Error != nil {
		logger.Error("db Err" + res.Error.Error())
		return 0
	}
	return menu.ID
}

func (obj *Menu) Del(input map[string]interface{}) uint64 {
	menu := Menu{}
	if err := mapstructure.Decode(input, &menu); err != nil {
		logger.Error("db Err" + err.Error())
		return 0
	}
	db := obj.Db()
	if hepler.Empty(menu.ID) == false {
		db = db.Where("id", menu.ID)
	} else {
		return 0
	}

	res := db.Delete(&menu)
	if res.Error != nil {
		logger.Error("db Err" + res.Error.Error())
		return 0
	}
	return menu.ID
}
